package geecache

//并发控制
import (
	"geecache/lru"
	"sync"
	"time"
)

// BaseCache 是一个接口，定义了基本的缓存操作方法。
//它包含了两个方法：add 和 get，用于向缓存中添加数据和从缓存中获取数据。
type BaseCache interface{
	add(key string,value ByteView)
	get(key string)(value ByteView,ok bool)
}
type LRUcache struct{
	mu sync.RWMutex
	lru *lru.Cache
	cacheBytes int64
	ttl time.Duration
}
func (c *LRUcache)add(key string,value ByteView){
	c.mu.Lock()
	defer c.mu.Unlock()
	if c.lru == nil{
    // 判断了 c.lru 是否为 nil，如果等于 nil 再创建实例。
    // 延迟初始化(Lazy Initialization),
	// 一个对象的延迟初始化意味着该对象的创建将会延迟至第一次
	// 使用该对象时。主要用于提高性能，并减少程序内存要求。
		c.lru = lru.New(c.cacheBytes,nil,c.ttl)
	}
	c.lru.Add(key,value,c.ttl)
}
func (c *LRUcache)get(key string)(value ByteView,ok bool){
	c.mu.RLock()
	defer c.mu.RUnlock()
	if c.lru == nil{
		return
	}
	if v,ok := c.lru.Get(key);ok{
		return v.(ByteView),ok
	}
	return
}